﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;



namespace BOL
{
    [Serializable]
    public class ObraBL
    {

        #region "CRUD"
        public int add(Obra entity,
                                   DataSet entityList)
        {
               using (TransactionScope ts = new TransactionScope())
                {


                    dbGestionDataContext _db =
                        new dbGestionDataContext(Parametros.strConnString);

                    Obra local = new Obra();
                                    
                    local.idProyecto=entity.idProyecto;
                    local.codigo= local.getCorrelativo(_db,entity.idProyecto.Value);
                    local.descripcion=entity.descripcion;
                    local.direccion=entity.direccion;
                    local.idpais=entity.idpais;
                    local.pais=entity.pais;
                    local.iddepartamento=entity.iddepartamento;
                    local.departamento=entity.departamento;
                    local.idprovincia=entity.idprovincia;
                    local.provincia=entity.provincia;
                    local.iddistrito=entity.iddistrito;
                    local.distrito=entity.distrito;
                    local.centroCosto=entity.centroCosto;
                    local.direcccionEntrega = entity.direcccionEntrega;
                    local.direccionFacturacion=entity.direccionFacturacion;
                    local.estructuraPorc=entity.estructuraPorc;
                    local.gastosPorc=entity.gastosPorc;
                    local.incluyeIGV=entity.incluyeIGV;
                    local.cliente=entity.cliente;
                    local.utilidadPorc=entity.utilidadPorc;
                    local.fechaInicio=entity.fechaInicio;
                    local.tipoCambio = entity.tipoCambio;
                    local.fechaCre=DateTime.Now;
                    local.fechaMod=DateTime.Now;
                    local.usuarioCre=entity.usuarioCre;
                    local.usuarioMod=entity.usuarioCre;
                    local.responsableEntrega = entity.responsableEntrega;
                    local.idTipoObra = entity.idTipoObra;
                    _db.Obras.InsertOnSubmit(local);
                    _db.SubmitChanges();

                    ts.Complete();
                    return local.idInternal;                 
                }
                
            }
        public bool update(Obra entity,
                                    DataSet entityList)
        {
              bool result=false;
                using (TransactionScope ts = new TransactionScope())
                {

                  
                    dbGestionDataContext _db =
                        new dbGestionDataContext(Parametros.strConnString);

                    Obra local=_db.Obras.Single(p=>p.idInternal==entity.idInternal);
                    
                    
                    //compara cambios y solo actualiza los cambiados
                    //int bl = _db.CompareObject<Obra>(local, entity);

                    local.idProyecto=entity.idProyecto;

                    local.descripcion=entity.descripcion;
                    local.direccion=entity.direccion;
                    local.idpais=entity.idpais;
                    local.pais=entity.pais;
                    local.iddepartamento=entity.iddepartamento;
                    local.departamento=entity.departamento;
                    local.idprovincia=entity.idprovincia;
                    local.provincia=entity.provincia;
                    local.iddistrito=entity.iddistrito;
                    local.distrito=entity.distrito;
                    local.centroCosto=entity.centroCosto;
                    local.direcccionEntrega=entity.direcccionEntrega;
                    local.direccionFacturacion=entity.direccionFacturacion;
                    local.estructuraPorc=entity.estructuraPorc;
                    local.gastosPorc=entity.gastosPorc;
                    local.cliente = entity.cliente;
                    local.utilidadPorc = entity.utilidadPorc;
                    local.fechaInicio = entity.fechaInicio;
                    local.fechaMod = entity.fechaMod;
                    local.usuarioMod = entity.usuarioMod;
                    local.tipoCambio = entity.tipoCambio;
                    local.responsableEntrega = entity.responsableEntrega;
                    local.idTipoObra = entity.idTipoObra;
                    //para poder cambiar el incluye IGV no debe existir  comparativos

                   

                    if (local.incluyeIGV != entity.incluyeIGV)
                    {
                        
                        var q = from a in _db.Comparativos
                                where a.idObra == entity.idInternal
                                select a;

                        if (q.Count() > 0)
                        {
                            throw new Exception("no pude cambiar Incluir IGV si existe Comparativos Registrados");
                        }

                    }
                    if (local.tipoCambio!= entity.tipoCambio )
                    {

                        var q = from a in _db.Presupuesto
                                where a.idObra == entity.idInternal & a.idMoneda!=3
                                select a;

                        if (q.Count() > 0)
                        {
                            throw new Exception("no pude cambiar Tipo Cambio si existe Comparativos Registrados");
                        }

                    }
                    local.incluyeIGV = entity.incluyeIGV;

                    

                    _db.SubmitChanges();
                   ts.Complete();
                   result=true;
                }
                return result;
            }
           
          
        public bool delete(int idObra)
        {
           
                bool result=false;
                using (TransactionScope ts = new TransactionScope())
                {

                    dbGestionDataContext _db;
                    _db = new dbGestionDataContext(Parametros.strConnString);

                    Obra local;



                    var q = from p in _db.Obras
                            where p.idInternal == idObra
                            select p;

                    

                    local = q.First();

                    var oc = _db.OrdenCompras.Where(p => p.idObra == idObra & p.idTipoOrden==1);
                    foreach (var item in oc)
                    {
                        new BOL.OrdenCompraBL().deleteOrdenCompra(item.idInternal);

                    }
                    var og = _db.OrdenCompras.Where(p => p.idObra == idObra & p.idTipoOrden != 1);
                    foreach (var item in og)
                    {
                        new BOL.OrdenCompraBL().deleteGastoObra(_db,item.idInternal);

                    }
                    var comp = _db.Comparativos.Where(p => p.idObra == idObra);
                    foreach (var item in comp)
                    {
                        new BOL.ComparativoBL().delete(item.idInternal);

                    }

                    

                    var par =_db.Presupuesto.Where(p=>p.idObra==idObra).ToList();
                            foreach (var item in par)
	                        {
                                new BOL.PresupuestoBL().delete(item.idInternal);

	                        }

                    


                    
                    _db.CompraProyeccions.DeleteAllOnSubmit(local.CompraProyeccions);
                    _db.EmpleadoObras.DeleteAllOnSubmit(local.EmpleadoObras);
                    _db.Obras.DeleteOnSubmit(local);
                    _db.SubmitChanges();
                    ts.Complete();
                    result = true;
                }
                return result;

        }
        #endregion

        int _count;
        public int Count(int idProyecto, int startRowIndex, int maximumRows, string sortExpression)
        {
            return _count;
        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<ObraListInfo> GetObraList(int idProyecto, int startRowIndex, int maximumRows, string sortExpression)
        {
            
            var q = ApplySelect_ObraListInfo();
            
                q = q.Where(a => idProyecto==0?a.idProyecto!=0: a.idProyecto == idProyecto);
                    
            
            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows).ToList();


            }




        private IQueryable<ObraListInfo> ApplySelect_ObraListInfo()
        {
            var q = from a in DbUtil.Db.Obras
                    select new ObraListInfo
                    {
                        centroCosto=a.centroCosto,
                        cliente=a.cliente,
                        codigo=a.codigo,
                        descripcion=a.descripcion,
                        direcccionEntrega=a.direcccionEntrega,
                        direccion=a.direccion,
                        direccionFacturacion=a.direccionFacturacion,
                        idEmpresa=a.Proyecto.idEmpresa.Value,
                        idInternal=a.idInternal,
                        idProyecto=a.idProyecto.Value,
                        incluyeIGV=a.incluyeIGV.Value,
                        proyecto=a.Proyecto.descripcion,
                        tipoCambio=a.tipoCambio.Value,
                        tipoObra=a.TipoObra.descripcion,
                        FechaCre=a.fechaCre.Value,
                        
                    };
            return q;
        }
        private IQueryable<ObraListInfo> ApplySort(IQueryable<ObraListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "centroCosto":
                    q = q.OrderBy(b => b.centroCosto);
                    break;
                case "centroCosto DESC":
                    q = q.OrderByDescending(b => b.centroCosto);
                    break;
                case "cliente":
                    q = q.OrderBy(b => b.cliente);
                    break;
                case "cliente DESC":
                    q = q.OrderByDescending(b => b.cliente);
                    break;
                case "codigo":
                    q = q.OrderBy(b => b.codigo);
                    break;
                case "codigo DESC":
                    q = q.OrderByDescending(b => b.codigo);
                    break;

                case "descripcion":
                    q = q.OrderBy(b => b.descripcion);
                    break;
                case "descripcion DESC":
                    q = q.OrderByDescending(b => b.descripcion);
                    break;


                case "direcccionEntrega":
                    q = q.OrderBy(b => b.direcccionEntrega);
                    break;
                case "direcccionEntrega DESC":
                    q = q.OrderByDescending(b => b.direcccionEntrega);
                    break;


                case "direccion":
                    q = q.OrderBy(b => b.direccion);
                    break;
                case "direccion DESC":
                    q = q.OrderByDescending(b => b.direccion);
                    break;
                case "direccionFacturacion":
                    q = q.OrderBy(b => b.direccionFacturacion);
                    break;
                case "direccionFacturacion DESC":
                    q = q.OrderByDescending(b => b.direccionFacturacion);
                    break;
                case "proyecto":
                    q = q.OrderBy(b => b.proyecto);
                    break;
                case "proyecto DESC":
                    q = q.OrderByDescending(b => b.proyecto);
                    break;

                case "tipoObra":
                    q = q.OrderBy(b => b.tipoObra);
                    break;
                case "tipoObra DESC":
                    q = q.OrderByDescending(b => b.proyecto);
                    break;
                default:
                    q = q.OrderByDescending(b => b.FechaCre);
                    break;
            }
            return q;
        }


        public void GenerarIndicador(dbGestionDataContext _db,int idObra,short anioCompra)
        {
             //considerando que las obras duran al rededor de 3 anio
            var indicadorList = _db.ObraIndicadors.Where(p => p.idObra == idObra & p.anio == anioCompra);
                if (indicadorList.Count() == 0)
                {
                    
                    for (int i = 0; i < 12; i++)
                    {
                        ObraIndicador indicador = new ObraIndicador();
                        indicador.SetAdd(_db,idObra,anioCompra,Convert.ToInt16(i + 1));
                        
                    }
                    _db.SubmitChanges();
                }

        }

    }
}
